iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

什麼是追蹤止損(Trailing Stop)

當我們在進行股票或投資交易時,一種常見的風險管理策略是「追蹤止損」。這種策略是基於我們的持倉獲利或虧損情況來調整止損價格。對於多頭持倉,當我們的盈利增加時,追蹤止損價格會隨之上調;而對於空頭持倉,隨著盈利增加,止損價格會下調。簡單來說,當我們持有多頭倉位時,如果市場價格已經高於我們的開倉價格,我們就會將止損價格提高到開倉價格以上;相反,如果我們持有空頭倉位,市場價格已經低於開倉價格,我們就會將止損價格降低到開倉價格以下。

一般而言,追蹤停損會按照事先設定的點數與當前價格之間的距離來調整。例如,如果我們設定了追蹤停損為300點,只有當當前價格偏離止損價格300點以上時,止損才會開始調整。我們也可以選擇在達到最低盈利要求後再啟動追蹤停損,或者增加追蹤停損的調整幅度。但通常來說,追蹤停損是一個逐點跟隨價格的策略。

現在,讓我們看一下如何實施這種簡單的追蹤停損策略。要計算追蹤停損價格,我們會根據當前的買入或賣出價格來加減停損點數。如果當前的停損價格與當前價格之間的距離大於追蹤停損點數,我們就需要調整持倉的停損值,以符合追蹤停損策略。

以下是在EA中的追蹤指損範例,追蹤指損的程式碼會放在OnTick()裡面,因為它需要在每次市場價格變動時檢查持倉情況,並根據追蹤止損策略來調整止損價格。當市場價格與開倉價格之間的距離大於追蹤止損點數時,它會觸發止損的調整操作。

// 定義追蹤止損的參數
input double TrailStop = 50; // 追蹤止損點數

void OnTick()
{
   double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); // 當前買價
   double openPrice = OrderOpenPrice(); // 開倉價格
   double stopLoss = OrderStopLoss(); // 當前止損價格

   // 計算當前價格與追蹤止損點數的距離
   double distance = MarketInfo(_Symbol, MODE_POINT) * TrailStop;

   // 設定追蹤止損,確保止損價格始終比開倉價格高 TrailStop 點
   if ((currentPrice - distance) > stopLoss)
   {
      OrderModify(OrderTicket(), openPrice, currentPrice - distance, OrderTakeProfit(), 0, clrNONE);
   }
}
  • 解析
    1. double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); 用於獲取當前市場的買價。

    2. double openPrice = OrderOpenPrice(); - 用於獲取你的開倉價格,即進入交易的價格。

    3. double stopLoss = OrderStopLoss(); - 用於獲取目前設定的止損價格。

    4. double distance = MarketInfo(_Symbol,MODE_POINT) * TrailStop; - 用於計算當前價格與追蹤止損點數之間的距離。TrailStop 是事先設定的追蹤止損點數。

    5. 最後,程式碼根據持倉類型(多頭或空頭)和市場價格相對於開倉價格的情況來調整止損價格。

      • 如果是多頭持倉且市場價格高於開倉價格,則會計算新的止損價格 newStopLoss,並確保它高於當前止損價格,然後觸發平倉操作以止損。
      • 如果是空頭持倉且市場價格低於開倉價格,則會計算新的止損價格 newStopLoss,並確保它低於當前止損價格,然後觸發平倉操作以止損。

最低獲利(Minimum Profit)

指在一項交易或投資中,我們願意接受的最低盈利金額。這個概念用於設定止損價格、追蹤止損策略或評估交易風險。當我們達到或超過最低獲利水平時,我們可能會考慮保護我們的利潤,以確保不會出現虧損,或者可以采取其他操作,如移動止損。

最低獲利水平的設定通常是基於我們的交易策略、風險容忍度和市場環境等因素而定。它可以是一個具體的金額或一個百分比,例如,我們可能決定在交易中至少要賺取100美元的利潤,或者設定在盈利達到交易本金的10%時考慮保護利潤。

設定最低獲利水平有助於確保我們不會在市場波動或情緒影響下過早退出交易,同時也有助於管理風險。當市場開始朝著我們的利潤目標前進時,我們可以更輕鬆地做出決策,以確保我們實現了至少最低獲利。

以下是結合追蹤止損和最低獲利概念的範例,以多頭(買進)交易為例,並根據市場價格的波動來設定追蹤止損和最低獲利。

// 定義追蹤止損和最低獲利的參數
input double TrailStop = 50; // 追蹤止損點數
input double MinProfit = 100; // 最低獲利金額

void OnTick()
{
   double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); // 當前買價
   double openPrice = OrderOpenPrice(); // 開倉價格
   double stopLoss = OrderStopLoss(); // 當前止損價格

   // 計算當前價格與追蹤止損點數的距離
   double distance = MarketInfo(_Symbol, MODE_POINT) * TrailStop;

   // 計算當前利潤
   double profit = (currentPrice - openPrice) * MarketInfo(_Symbol, MODE_LOTSIZE);

   // 設定追蹤止損,確保止損價格始終比開倉價格高 TrailStop 點
   if (profit > MinProfit && (currentPrice - distance) > stopLoss)
   {
      OrderModify(OrderTicket(), openPrice, currentPrice - distance, OrderTakeProfit(), 0, clrNONE);
   }
}
  • 解析
    1. 根據當前價格計算出追蹤止損的距離,並將其設定為開倉價格以下指定的點數(TrailStop)。

    2. 計算當前的利潤,並檢查是否達到或超過最低獲利(MinProfit)。

    3. 如果達到最低獲利,且市場價格高於止損點(即距離大於 TrailStop),則將止損價格調整為當前價格減去追蹤止損的距離。

步進值(step value)

步進式的追蹤止損策略是一種根據市場價格的變動逐步調整止損價格的策略。這個策略會在市場價格上漲時逐步提高止損價格,以保護已經獲得的盈利。這可以幫助我們鎖定更多的盈利,並降低潛在的虧損風險。

以下是上個程式碼新增了步進的概念:

// 定義追蹤止損、最低獲利和步進的參數
input double TrailStop = 50; // 追蹤止損點數
input double MinProfit = 100; // 最低獲利金額
input double Step = 10; // 步進值,即每次調整止損的點數

void OnTick()
{
   double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); // 當前買價
   double openPrice = OrderOpenPrice(); // 開倉價格
   double stopLoss = OrderStopLoss(); // 當前止損價格

   // 計算當前價格與追蹤止損點數的距離
   double distance = MarketInfo(_Symbol, MODE_POINT) * TrailStop;

   // 計算當前利潤
   double profit = (currentPrice - openPrice) * MarketInfo(_Symbol, MODE_LOTSIZE);

   // **新增的部分:計算已實現利潤相對於步進的餘數**
   double profitRemainder = profit % Step;

   // 設定追蹤止損,確保止損價格始終比開倉價格高 TrailStop 點,並且利潤餘數大於步進值
   if (profit > MinProfit && (currentPrice - distance) > stopLoss && profitRemainder >= Step)
   {
      double newStopLoss = stopLoss + Step * MarketInfo(_Symbol, MODE_POINT);
      OrderModify(OrderTicket(), openPrice, newStopLoss, OrderTakeProfit(), 0, clrNONE);
   }
}

動態追蹤指損(Dynamic Trailing Stop)

一種交易策略中的止損管理技巧。它的主要特點是,隨著市場價格的變動,止損價格會相應地調整以保護已實現的利潤。這種策略的目的是在保護利潤的同時,允許交易持續參與市場,以捕捉更多的價格變動。

特點和原則:

  • 保護利潤: 動態追蹤止損的主要目的是確保已實現的利潤不會在市場反轉時被抹除。它允許交易者鎖定一部分利潤,並讓其繼續參與市場。

  • 隨趨勢而動: 這種止損方法會隨著市場趨勢的變化而調整。當市場價格朝著有利方向移動時,止損價格會上升(對多倉來說),或下降(對空倉來說)。

  • 避免過早退出: 動態追蹤止損有助於避免過早退出交易。當市場價格波動時,固定的止損水平可能會在短期內觸發,而動態追蹤止損則可以更靈活地應對價格波動。

  • 減少情緒干擾: 這種策略可以減少交易者的情緒干擾。當止損自動調整時,交易者無需過多地干涉交易,減少了情緒因素對交易決策的影響。

  • 選擇適當的參數: 動態追蹤止損的有效性取決於設定的參數,例如步進值(Step)。選擇適當的參數可以根據特定市場條件和交易策略來調整止損,並避免過多的交易干擾。

什麼時候使用動態追蹤止損:

  • 趨勢市場: 動態追蹤止損特別適用於趨勢市場,因為它可以讓交易者在趨勢延續時保持持倉,同時在趨勢反轉時保護利潤。

  • 大幅波動市場: 在大幅波動的市場中,固定的止損水平可能會過早觸發。動態追蹤止損可以更好地應對價格波動,減少過早退出的風險。

  • 長期交易: 如果你的交易持續一段較長的時間,動態追蹤止損可以幫助你在長期趨勢中獲得更多的利潤,同時保護資本。

以下是一個使用MA指標來設置動態追蹤止損的範例,根據MA指標的值來動態調整止損價格。

input int MA_Period = 14; // 移動平均的周期
input ENUM_MA_METHOD MA_Method = MODE_SMA; // 移動平均方法

void OnTick()
{
    double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); // 當前買價
    double openPrice = OrderOpenPrice(); // 開倉價
    double stopLoss = OrderStopLoss(); // 當前止損價

    // 1. 計算移動平均值
    double maValue = iMA(_Symbol, 0, MA_Period, 0, MA_Method, PRICE_CLOSE, 0);

    // 2. 計算止損價格
    double newStopLoss;

    if (OrderType() == OP_BUY)
    {
        newStopLoss = maValue - (currentPrice - openPrice);
    }
    else if (OrderType() == OP_SELL)
    {
        newStopLoss = maValue + (openPrice - currentPrice);
    }

    // 3.更新止損價格
    if (newStopLoss != stopLoss)
    {
        OrderModify(OrderTicket(), openPrice, newStopLoss, OrderTakeProfit(), 0, clrNONE);
    }
}
  • 解析
    1. 計算移動平均值:使用iMA函數來計算指定周期和方法的移動平均線值。在這里,它計算的是收盤價的移動平均。
    2. 計算止損價格:如果是買單(OP_BUY),則新的止損價為移動平均值減去(當前價格 - 開倉價格),如果是賣單(OP_SELL),則新的止損價為移動平均值加上(開倉價格 - 當前價格)。
    3. 更新止損價格:如果計算出的新止損價格與當前設置的止損價格不同,就使用OrderModify函數來更新止損價。

上一篇
DAY23 用helper來簡化
下一篇
DAY25 指標介紹(上)
系列文
從零開始的外匯自動程式交易30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言